package com.ruoyi.framework.mybatisplus.strategy.strategies;

import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.ruoyi.framework.mybatisplus.OperateSymbol;
import com.ruoyi.framework.mybatisplus.strategy.AbstractQueryStrategy;


import java.lang.reflect.Field;

/**
 * 空值查询策略实现类
 * 用于处理IS NULL和IS NOT NULL查询条件
 * 字段名需要以"IsNull"结尾才会匹配此策略
 * 字段值必须是Boolean类型，true表示IS NULL，false表示IS NOT NULL
 * 
 * @author xuzhen97
 */
public class IsNullStrategy extends AbstractQueryStrategy {
    
    /**
     * 构造函数
     * 设置操作符为IS_NULL
     */
    public IsNullStrategy() {
        super(OperateSymbol.IS_NULL);
    }

    /**
     * 应用查询条件
     * 根据Boolean值决定添加IS NULL还是IS NOT NULL条件
     * 如果值为true，添加IS NULL条件
     * 如果值为false，添加IS NOT NULL条件
     * 
     * @param prefix 字段前缀
     * @param obj 查询对象
     * @param key 字段名
     * @param field 字段对象
     * @param wrapper 查询包装器
     * @throws RuntimeException 当字段值不是Boolean类型时抛出异常
     */
    @Override
    public void apply(String prefix, Object obj, String key, Field field, AbstractWrapper wrapper) {
        String fieldName = getFieldName(key, field);
        Object value = getValue(obj, field);
        if (value != null && !(value instanceof Boolean)) {
            throw new RuntimeException("is_null条件必须是Boolean类型");
        }
        if (value != null) {
            if ((Boolean) value) {
                wrapper.isNull(prefix + fieldName);
            } else {
                wrapper.isNotNull(prefix + fieldName);
            }
        }
    }
} 